/**
 * @Author Fizz Pu
 * @Date 2021/3/9 下午4:57
 * @Version 1.0
 * 失之毫厘，缪之千里！
 */
/**
给定一个单链表的头节点head, 实现一个调整单链表的函数，使得每K个节点之间逆序，如果最后不够K个节点一组，则不调整最后几个节点。
        例如：
        链表:1->2->3->4->5->6->7->8->null, K = 3。
        调整后：3->2->1->6->5->4->7->8->null。其中 7，8不调整，因为不够一组。
*/
 public class AdjustLinkList {
    public ListNode adJustLinkList(ListNode head, int k){
       ListNode start = head;
       ListNode end = head;

       for(int i = 1; end != null && i < k; i++){
          end = end.next;
       }

       // 不足k个,不反转
       if(end == null) {
           return head;
       }

       ListNode next = end.next;
       end.next = null;
       reverse(start);
       start.next = adJustLinkList(next, k);
       return end;
    }

    private ListNode reverse(ListNode head){
        ListNode pre = null;
        ListNode cur = head;
        ListNode next;

        while (cur != null){
            next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }

        return pre;
    }

    public static void main(String[] args) {
        AdjustLinkList adjustLinkList = new AdjustLinkList();
        ListNode head = new ListNode(1);
        ListNode pre = head;
        for(int i = 2; i <= 8; i++){
           pre.next = new ListNode(i);
           pre = pre.next;
        }

        ListNode tmp =  adjustLinkList.adJustLinkList(head, 3);

        for(int i = 0; i < 8; i++){
            System.out.println(tmp.val);
            tmp = tmp.next;
        }
    }
 }
